//package com.wusiwei.common;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.converter.HttpMessageNotReadableException;
//import org.springframework.security.access.AccessDeniedException;
//import org.springframework.security.authentication.BadCredentialsException;
//import org.springframework.security.authentication.DisabledException;
//import org.springframework.security.authentication.LockedException;
//import org.springframework.security.core.AuthenticationException;
//import org.springframework.security.core.userdetails.UsernameNotFoundException;
//import org.springframework.validation.BindException;
//import org.springframework.validation.BindingResult;
//import org.springframework.validation.FieldError;
//import org.springframework.web.bind.MethodArgumentNotValidException;
//import org.springframework.web.bind.MissingServletRequestParameterException;
//import org.springframework.web.bind.annotation.ExceptionHandler;
//import org.springframework.web.bind.annotation.ResponseStatus;
//import org.springframework.web.bind.annotation.RestControllerAdvice;
//import org.springframework.web.multipart.MaxUploadSizeExceededException;
//
//import java.io.IOException;
//
///**
// * 全局异常处理器
// * 统一处理系统中的各类异常，返回标准格式的响应
// */
//@RestControllerAdvice
//public class GlobalExceptionHandler {
//
//    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
//
//    /**
//     * 处理业务异常
//     */
//    @ExceptionHandler(BusinessException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleBusinessException(BusinessException e) {
//        log.error("业务异常: {}", e.getMessage());
//        if (e.getResultCode() != null) {
//            return ApiResult.failed(e.getResultCode());
//        }
//        return ApiResult.failed(e.getMessage());
//    }
//
//    /**
//     * 处理参数验证异常
//     */
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleValidException(MethodArgumentNotValidException e) {
//        BindingResult bindingResult = e.getBindingResult();
//        StringBuilder message = new StringBuilder();
//        if (bindingResult.hasErrors()) {
//            FieldError fieldError = bindingResult.getFieldError();
//            if (fieldError != null) {
//                message.append(fieldError.getDefaultMessage());
//            }
//        }
//        return ApiResult.validateFailed(message.toString());
//    }
//
//    /**
//     * 处理参数绑定异常
//     */
//    @ExceptionHandler(value = BindException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleBindException(BindException e) {
//        BindingResult bindingResult = e.getBindingResult();
//        String message = "";
//        if (bindingResult.hasErrors()) {
//            FieldError fieldError = bindingResult.getFieldError();
//            if (fieldError != null) {
//                message = fieldError.getDefaultMessage();
//            }
//        }
//        return ApiResult.validateFailed(message);
//    }
//
//    /**
//     * 处理请求参数缺失异常
//     */
//    @ExceptionHandler(MissingServletRequestParameterException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
//        log.error("请求参数缺失: {}", e.getMessage());
//        return ApiResult.validateFailed("缺少必要的请求参数: " + e.getParameterName());
//    }
//
//    /**
//     * 处理请求体解析异常
//     */
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
//        log.error("请求体解析异常: {}", e.getMessage());
//        return ApiResult.validateFailed("请求体解析失败，请检查请求格式");
//    }
//
//    /**
//     * 处理权限不足异常
//     */
//    @ExceptionHandler(AccessDeniedException.class)
//    @ResponseStatus(HttpStatus.FORBIDDEN)
//    public ApiResult<Void> handleAccessDeniedException(AccessDeniedException e) {
//        log.error("权限不足: {}", e.getMessage());
//        ApiResult<Void> result = ApiResult.forbidden(null);
//        result.setMessage("您没有权限访问此资源");
//        return result;
//    }
//
//    /**
//     * 处理认证失败异常
//     */
//    @ExceptionHandler(BadCredentialsException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    public ApiResult<Void> handleBadCredentialsException(BadCredentialsException e) {
//        log.error("认证失败: {}", e.getMessage());
//        return ApiResult.failed(ResultCode.UNAUTHORIZED, "用户名或密码不正确");
//    }
//
//    /**
//     * 处理用户名未找到异常
//     */
//    @ExceptionHandler(UsernameNotFoundException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    public ApiResult<Void> handleUsernameNotFoundException(UsernameNotFoundException e) {
//        log.error("用户未找到: {}", e.getMessage());
//        return ApiResult.failed(ResultCode.UNAUTHORIZED, "用户不存在");
//    }
//
//    /**
//     * 处理用户账户被锁定异常
//     */
//    @ExceptionHandler(LockedException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    public ApiResult<Void> handleLockedException(LockedException e) {
//        log.error("账户被锁定: {}", e.getMessage());
//        return ApiResult.failed(ResultCode.UNAUTHORIZED, "账户已被锁定，请联系管理员");
//    }
//
//    /**
//     * 处理用户账户被禁用异常
//     */
//    @ExceptionHandler(DisabledException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    public ApiResult<Void> handleDisabledException(DisabledException e) {
//        log.error("账户被禁用: {}", e.getMessage());
//        return ApiResult.failed(ResultCode.UNAUTHORIZED, "账户已被禁用，请联系管理员");
//    }
//
//    /**
//     * 处理所有认证异常
//     */
//    @ExceptionHandler(AuthenticationException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    public ApiResult<Void> handleAuthenticationException(AuthenticationException e) {
//        log.error("认证异常: {}", e.getMessage());
//        return ApiResult.failed(ResultCode.UNAUTHORIZED, "认证失败：" + e.getMessage());
//    }
//
//    /**
//     * 处理文件上传大小超限异常
//     */
//    @ExceptionHandler(MaxUploadSizeExceededException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ApiResult<Void> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
//        log.error("文件上传大小超限: {}", e.getMessage());
//        return ApiResult.failed("上传文件大小超出限制");
//    }
//
//    /**
//     * 处理IO异常
//     */
//    @ExceptionHandler(IOException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    public ApiResult<Void> handleIOException(IOException e) {
//        log.error("IO异常: {}", e.getMessage(), e);
//        return ApiResult.failed("文件读写异常");
//    }
//
//    /**
//     * 处理所有未捕获的异常
//     */
//    @ExceptionHandler(Exception.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    public ApiResult<Void> handleException(Exception e) {
//        log.error("系统异常: ", e);
//        return ApiResult.failed("系统内部错误，请联系管理员");
//    }
//}